package net.atomarrow.util.excel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;

public class ExcelDatas {


	/**
	 * 自适应行或列位置,会在当前最后行或列后自增
	 */
	public static final int AUTO=-1;
	/**
	 * 与当前编辑的行或列相同
	 */
	public static final int LAST=-2;

	/**
	 * 在当前行列基础上增减
	 */
	public static final int BASE_LAST=-99999;

	private List<ExcelDataInterface> exceldatas;

	private ExcelFormatListener format;

	private ExcelDataChangeListener dataChanger;

	private List<CellRangeAddress> regions;

	private String sheetName;

	private HashMap<Integer,Integer> columnWidthMap;
	private HashMap<Integer,Integer> rowHeightMap;
	private HashMap<Integer, String[]> columnSelect;

	public HashMap<Integer, Integer> getColumnWidthMap() {
		return columnWidthMap;
	}


	public void setColumnSelect(int index, String[] options) {
		if (columnSelect == null) {
			columnSelect = new HashMap<>();
		}
		columnSelect.put(index, options);
	}

	public void setColumnWidth(int index,int width){
		if(columnWidthMap==null){
			columnWidthMap=new HashMap<Integer, Integer>();
		}
		columnWidthMap.put(index, width);
	}

	public void setRowHeight(int index,int height){
		if(rowHeightMap==null){
			rowHeightMap=new HashMap<Integer, Integer>();
		}
		rowHeightMap.put(index, height);
	}

	public String getSheetName() {
		return sheetName==null?"sheet1":sheetName;
	}

	public void setSheetName(String sheetName) {
		this.sheetName = sheetName;
	}

	public ExcelDatas() {
		exceldatas = new ArrayList<ExcelDataInterface>();
	}

	public void addFormatListerner(ExcelFormatListener format){
		this.format=format;
	}

	public void addRegion(CellRangeAddress region){
		if(regions==null){
			regions=new ArrayList<CellRangeAddress>();
		}
		regions.add(region);
	}
	public List<CellRangeAddress> getRegions(){
		return regions;
	}

	/**
	 * 增加实体List
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param datas
	 *            数据list
	 * @param columns
	 *            实体对应要添加的列
	 * @return
	 */
	public ExcelDatas addObjectList(int row, int column, List datas,
			String[] columns) {
		return addObjectList(row, column, datas, columns, null);
	}
	/**
	 * 增加实体List
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param columnMap
	 *            列map
	 * @param datas
	 *            对象list
	 * @param columns
	 *            实体对应要添加的列
	 * @return
	 */
	public ExcelDatas addObjectList(int row, int column, Map columnMap,List datas,
			String[] columns) {
		return addObjectList(row, column, datas,columnMap,columns, null);
	}

	/**
	 * 增加字符串List
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param datas
	 * @return
	 */
	public ExcelDatas addStringList(int row, int column, List<String> datas) {
		return addStringList(row, column, datas, null);
	}

	/**
	 * 增加字符串数组
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param values
	 *            实体对应要添加的列
	 * @return
	 */
	public ExcelDatas addStringArray(int row, int column, String[] values) {
		return addStringArray(row, column, values, null);
	}

	/**
	 * 增加实体
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param data
	 * @param columns
	 * @return
	 */
	public ExcelDatas addObject(int row, int column, Object data,
			String[] columns) {
		return addObject(row, column, data, columns, null);
	}
	/**
	 * 增加实体
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param columnMap
	 * 			  列map
	 * @param data
	 * 			  对象
	 * @param columns
	 * 			  对应列
	 * @return
	 */
	public ExcelDatas addObject(int row, int column, Map columnMap,Object data,
			String[] columns) {
		return addObject(row, column, data,columnMap, columns, null);
	}

	/**
	 * 增加实体
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param columnMap
	 * 			  列map
	 * @param data
	 * 			  对象
	 * @param columns
	 * 			  对应列
	 * @return
	 */
	private ExcelDatas addObject(int row, int column, Object data,
			Map columnMap, String[] columns, CellStyle CellStyle) {
		exceldatas.add(new ObjectData(row, column,columnMap, data, columns, CellStyle));
		return this;
	}

	/**
	 * 增加字符串
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param s
	 * @return
	 */
	public ExcelDatas addString(int row, int column, String s) {
		return addString(row, column, s, null);
	}

	/**
	 * 增加实体List
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param datas
	 *            对象list
	 * @param columns
	 *            实体对应要添加的列
	 * @return
	 */
	public ExcelDatas addObjectList(int row, int column, List datas,
			String[] columns, CellStyle CellStyle) {
		exceldatas.add(new ListData(row, column, datas, columns, CellStyle));
		return this;
	}
	/**
	 * 增加实体List
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param datas
	 *            对象list
	 * @param columnMap
	 *            列map
	 * @param columns
	 *            实体对应要添加的列
	 * @return
	 */
	public ExcelDatas addObjectList(int row, int column, List datas,Map columnMap,
			String[] columns, CellStyle CellStyle) {
		exceldatas.add(new ListData(row, column, datas, columns,columnMap, CellStyle));
		return this;
	}

	/**
	 * 增加字符串List
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param datas
	 * @return
	 */
	public ExcelDatas addStringList(int row, int column, List<String> datas,
			CellStyle CellStyle) {
		exceldatas.add(new ArrayData(row, column, datas.toArray(), CellStyle));
		return this;
	}

	/**
	 * 增加字符串数组
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param values
	 *            实体对应要添加的列
	 * @return
	 */
	public ExcelDatas addStringArray(int row, int column, String[] values,
			CellStyle CellStyle) {
		exceldatas.add(new ArrayData(row, column, values, CellStyle));
		return this;
	}

	/**
	 * 增加实体
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param data
	 * @param columns
	 * @return
	 */
	public ExcelDatas addObject(int row, int column, Object data,
			String[] columns, CellStyle CellStyle) {
		exceldatas.add(new ObjectData(row, column, data, columns, CellStyle));
		return this;
	}

	/**
	 * 增加字符串
	 *
	 * @param row
	 *            起始行 自动匹配使用ExcelDataInterface.AUTO
	 * @param column
	 *            起始列 自动匹配使用ExcelDataInterface.AUTO
	 * @param s
	 * @return
	 */
	public ExcelDatas addString(int row, int column, String s,
			CellStyle CellStyle) {
		exceldatas
				.add(new ArrayData(row, column, new String[] { s }, CellStyle));
		return this;
	}

	/**
	 * 得到单元格内容
	 *
	 * @param region
	 */
	public List<CellData> getCellDatas() {
		return getCellDatas( -1, -1);
	}


	/**
	 * the last cellData's getEndColumn
	 */
	public int getEndColumn() {
		if (exceldatas == null)
			return 0;
		return exceldatas.get(exceldatas.size() - 1).getEndColumn();
	}

	/**
	 * the last cellData's getEndRow
	 */
	public int getEndRow() {
		if (exceldatas == null)
			return 0;
		return exceldatas.get(exceldatas.size() - 1).getEndRow();
	}


	public List<CellData> getCellDatas(int endRow, int endColumn) {
		ArrayList<CellData> cellDatas = new ArrayList<CellData>();
		for (ExcelDataInterface inter : exceldatas) {
			//if use AUTO or LAST, to process the row location,
			inter.ReplaceAuto(endRow, endColumn);
			cellDatas.addAll(inter.getCellDatas(regions,format,dataChanger));
			endRow = inter.getEndRow();
			endColumn = inter.getEndColumn();
		}
		return cellDatas;
	}

	public void addDataChanger(ExcelDataChangeListener dataChanger) {
		this.dataChanger = dataChanger;
	}
	public HashMap<Integer, Integer> getRowHeightMap() {
		return rowHeightMap;
	}

	public HashMap<Integer, String[]> getColumnSelect() {
		return columnSelect;
	}
}
